import 'dart:math';

class Point {
  num? x, y;

  // 默认构造函数
  Point(this.x, this.y) {
    print(x);
  }

  //命名构造函数
  Point.origin(this.x, this.y) {}

  //命名构造函数
  Point.fromJson({this.x = 0, this.y = 0}) {}

  ///初始化列表
  ///
  ///初始化列表就是在构造函数执行之前执行的代码，和调用父类的构造函数一样，也使用:操作符
  ///初始化列表很有用，尤其是初始化那些final修饰的成员变量时，因为在方法体中，不能给final修饰的成员变量赋值
  Point.fromJson1(Map<String,double> json) : x = json['x'] , y = json['y'] {
    print('In Point.fromJson(): ($x, $y)');
  }
}

///初始化列表
class Point1 {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point1(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}

//常量构造函数
class ImmutablePoint {
  // 属性必须通过 final 声明
  final num x;
  final num y;

  // 常量构造函数，必须通过 const 声明。常量构造函数，不能有body
  const ImmutablePoint(this.x, this.y);
}
///不推荐
class Test{
  late int x;//在构造函数中会被初始赋值的字段不要使用 late 进行修饰
  Test(int p){
    x = p + 1;
  }
}

///推荐
class Test1{
  int x;
  Test1(int p)
      : x = p + 1;
}



class Student {
  String? firstName;
  Student.from(Map data) {
    print("in Student");
  }
}

class Jone extends Student {
  Jone.fromJson(Map data) : super.from(data) {
    print("in Jone");
  }
}


void main() {
  //命名构造函数
  var p1 = Point.fromJson(y: 1, x: 2);
  var p2 = Point.origin(1, 2);

  //---------------------常量构造函数---------------------
  var p3 = const ImmutablePoint(1, 2);
  var p4 = const ImmutablePoint(1, 2);
  var p5 = const ImmutablePoint(3, 4);
  print(p3 == p4); // true
  print(identical(p3, p4)); // true 比较两个对象是否相等
  print(identical(p4, p5)); // false 比较两个对象是否相等
}
